package ec.edu.ucacue.siop.proceso.iniciar.aplicacion;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import ec.edu.ucacue.siop.dao.material.ClaseMaterialDAO;
import ec.edu.ucacue.siop.dao.material.ClaseMaterialDAOImpl;
import ec.edu.ucacue.siop.dao.material.MaterialDAO;
import ec.edu.ucacue.siop.dao.material.MaterialDAOImpl;
import ec.edu.ucacue.siop.dao.material.PropiedadDAO;
import ec.edu.ucacue.siop.dao.material.PropiedadDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.EnergiaUsoDAO;
import ec.edu.ucacue.siop.dao.recurso.EnergiaUsoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefProdDAO;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefProdDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefUsoDAO;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefUsoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.UnidadFuncionalDAO;
import ec.edu.ucacue.siop.dao.recurso.UnidadFuncionalDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.competencia.CompetenciaDAO;
import ec.edu.ucacue.siop.dao.recurso.competencia.CompetenciaDAOImpl;
import ec.edu.ucacue.siop.modelo.material.ClaseMaterial;
import ec.edu.ucacue.siop.modelo.material.Material;
import ec.edu.ucacue.siop.modelo.material.Propiedad;
import ec.edu.ucacue.siop.modelo.recurso.EnergiaUso;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefProd;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefUso;
import ec.edu.ucacue.siop.modelo.recurso.UnidadFuncional;
import ec.edu.ucacue.siop.modelo.recurso.VariableAlimentacion;
import ec.edu.ucacue.siop.modelo.recurso.VariableProceso;
import ec.edu.ucacue.siop.modelo.recurso.competencia.Competencia;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;

public class CargaInicialOrganizacion {
	private String error;
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}
	public boolean cargar(String directorio, String archivo){
		
		List<ClaseMaterial> listaClaseMaterial = new ArrayList<ClaseMaterial>();
		LectorExcelUnidadProduccion lector = new LectorExcelUnidadProduccion();
		
		if(lector.leer(directorio+"/"+archivo)) {
			
			ContUnidadFuncional guapan = lector.getUnidadFuncional();
			Session ses = HibernateUtil.beginTransaction();
			MaterialDAO materialDao = new MaterialDAOImpl();
			ClaseMaterialDAO claseMaterialDao = new ClaseMaterialDAOImpl();
			// Recuperar la lista de materiales cargados con anterioridad
			List<Material> listaMaterial = materialDao.findAll(Material.class);
			listaClaseMaterial = claseMaterialDao.findAll(ClaseMaterial.class);
			boolean operacion = true;
			// creacion de las unidades base
			System.out.println("paso por carga de materiales");
			List<ContClaseMaterial> listaClase = lector.getListaClaseMaterial();
			for(int i=0; i<listaClase.size(); i++) {
				if(buscarPorNombreClaseMat(listaClaseMaterial,listaClase.get(i).getNombreClase()) == -1){
					ClaseMaterial clase = claseMaterialDao.create(listaClase.get(i).getNombreClase(), null);
					listaClaseMaterial.add(clase);
					claseMaterialDao.save(clase);
				}
			}
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
			
			ses = HibernateUtil.beginTransaction();
			
			List<ContPropiedad> listaProp = lector.getListaPropiedad();
			PropiedadDAO propDao = new PropiedadDAOImpl();
			for(int i=0; i<listaProp.size(); i++){
				Propiedad prop = propDao.create(listaProp.get(i).getNombre(), null, null, false);
				ses.save(prop);
			}
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
			
			
			ses = HibernateUtil.beginTransaction();
			List<ContMaterial> listaContMaterial = lector.getListaMaterial();
			for(int i=0; i<listaContMaterial.size(); i++){
				if(buscarListaMaterial(listaMaterial,listaContMaterial.get(i).getNombre()) == -1) {
					// crear Material
					List<ClaseMaterial> listaClaseMaterialPropio = new ArrayList<ClaseMaterial>();
					for(int j=0; j<listaContMaterial.get(i).getListaClaseMaterial().size();j++){
						int pos = buscarPorNombreClaseMat(listaClaseMaterial, listaContMaterial.get(i).getListaClaseMaterial().get(j));
						listaClaseMaterialPropio.add(listaClaseMaterial.get(pos));
					}
					Material nuevo = materialDao.create(listaContMaterial.get(i).getNombre(), listaClaseMaterial);
					listaMaterial.add(nuevo);
					materialDao.save(nuevo);
				}
			}
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
			
			UnidadFuncionalDAO unidadDao = new UnidadFuncionalDAOImpl();
			VariableProcesoDAO varProDao = new VariableProcesoDAOImpl();
			VariableAlimentacionDAO varAlimDao = new VariableAlimentacionDAOImpl();
			MaterialDefUsoDAO matUsoDao = new MaterialDefUsoDAOImpl();
			MaterialDefProdDAO matProdDao = new MaterialDefProdDAOImpl();
			EnergiaUsoDAO enerUsoDao = new EnergiaUsoDAOImpl();
			
			UnidadFuncional principal = unidadDao.createUnidadFuncional("GUAPAN", null,null, "Empresa", 0);
			
			UnidadFuncional produccion = unidadDao.createUnidadFuncional("Produccion", null, principal, "Gerencia", 1);
			ses = HibernateUtil.beginTransaction();			
			List<ContUnidadFuncional> listaContUF = lector.getListaUnidad();
			System.out.println("tamano lista =" + listaContUF.size());
			for(int i=0; i<listaContUF.size(); i++){
				System.out.println(listaContUF.get(i).getNombreUnidad());
				UnidadFuncional unidadArea = unidadDao.createUnidadFuncional(listaContUF.get(i).getNombreUnidad(), 
						null, produccion, "Area", 2);
			
				for(int j=0; j<listaContUF.get(i).getListaHija().size(); j++) {
					System.out.println("->" + listaContUF.get(i).getListaHija().get(j).getNombreUnidad());
					String nombreUnidad = listaContUF.get(i).getListaHija().get(j).getNombreUnidad();
					// se inican las entradas y salidas de productos 
					List<MaterialDefUso> listaInsumos = new ArrayList<MaterialDefUso>();
					List<MaterialDefProd> listaProductos = new ArrayList<MaterialDefProd>();
					List<EnergiaUso> listaEnergia = new ArrayList<EnergiaUso>();
					if(!(nombreUnidad.contentEquals("ALIM.") || nombreUnidad.contentEquals("Producto")) ) {
						UnidadFuncional unidadSistema = unidadDao.createUnidadFuncional(listaContUF.get(i).getListaHija().get(j).getNombreUnidad(), 
								null, unidadArea, "Sistema", 3);
						for(int k=0; k<listaContUF.get(i).getListaHija().get(j).getListaVarProceso().size();k++){
							System.out.println("----> Var " + listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre());
							String nombreVar = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre();
							String fuenteDato = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato();
							boolean medida = (listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato().contentEquals("Calculada"))?false:true; 
							VariableProceso var = varProDao.create(nombreVar, null, unidadSistema, medida, fuenteDato, null);
						}
					}
					else{
						if(nombreUnidad.contentEquals("ALIM.")){
							for(int k=0; k<listaContUF.get(i).getListaHija().get(j).getListaVarProceso().size();k++){
								System.out.println("----> Var " + listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre());
								String nombreVar = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre();
								String fuenteDato = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato();
								boolean medida = (listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato().contentEquals("Calculada"))?false:true;
								String nomMaterial = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getMaterial();
								if(nomMaterial.length()>0){					
									int iPosLM = buscarListaMaterial(listaMaterial, nomMaterial);
									System.out.println("iPos " + iPosLM + "  lista " + listaMaterial.get(iPosLM));
									MaterialDefUso material= matUsoDao.create(listaMaterial.get(iPosLM), 0, unidadArea);
									listaInsumos.add(material);
								}
								int posLI = listaInsumos.size();
								VariableAlimentacion varAlim = varAlimDao.create(nombreVar, listaInsumos.get(posLI-1), null, null, fuenteDato, 
										medida, null, null, unidadArea);
							}
						}
						if(nombreUnidad.contentEquals("Producto")){
							for(int k=0; k<listaContUF.get(i).getListaHija().get(j).getListaVarProceso().size();k++){
								System.out.println("----> Var " + listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre());
								String nombreVar = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getNombre();
								String fuenteDato = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato();
								boolean medida = (listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getFuenteDato().contentEquals("Calculada"))?false:true; 
								String nomMaterial = listaContUF.get(i).getListaHija().get(j).getListaVarProceso().get(k).getMaterial();
								if(nomMaterial.length()>0) {
									int iPosLM = buscarListaMaterial(listaMaterial, nomMaterial);
									MaterialDefProd material = matProdDao.create(listaMaterial.get(iPosLM), 0, unidadArea);
									listaProductos.add(material);
								}
								int posLP = listaProductos.size();
								VariableAlimentacion varProd = varAlimDao.create(nombreVar, null, listaProductos.get(posLP-1), null, fuenteDato, 
										medida, null, null, unidadArea);
							}
						}
					}
				}
			}
			unidadDao.save(principal);
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
			
			return true;

		}
		else {
			error =" no se leyo el archivo ";
			return false;

	}
	
	
	}
	private int buscarListaMaterial(List<Material> listaMaterial,
			String nombre) {
		int pos = -1;
		for(int i=0; i<listaMaterial.size(); i++) {
			if(listaMaterial.get(i).getNombre().contentEquals(nombre)) {
				pos = i;
			}
		}
		if(pos == -1) System.out.println("material " + nombre +" no esta en la base de datos");
		return pos;
	}
	
	private int buscarPorNombreClaseMat(List<ClaseMaterial> listaClaseMaterial,
			String nombreClase) {
		int posicion=-1;
				for(int i=0; i<listaClaseMaterial.size();i++) {
					if(listaClaseMaterial.get(i).getNombre().contentEquals(nombreClase)) {
						posicion = i;
					}
				}
		return posicion;
	}
	private List<Competencia> creacionNuevaCompetencia(
			List<Competencia> listaCompetencia,
			List<String> listaCompetencia2, CompetenciaDAO competenciaDAO) {
		List<Competencia> listaRetorno = new ArrayList<Competencia>();
		for(int i=0; i<listaCompetencia2.size(); i++) {
			boolean encontrado = false;
			for(int j=0; j<listaCompetencia.size(); j++) {
				if(listaCompetencia2.get(i).contentEquals(listaCompetencia.get(j).getNombre())) {
					encontrado = true;
					listaRetorno.add(listaCompetencia.get(j));
					break;
				}
				if(!encontrado) {
					Competencia competencia = competenciaDAO.create(listaCompetencia2.get(i), "", null);
					listaRetorno.add(competencia);
					listaCompetencia.add(competencia);
				}
			}
		}
		return null;
	}
	
	
	
}
